# -*- coding: utf-8 -*-
from django.db import models

from decimal import Decimal
from frota.enums import Situacao
from djtools.dbfields import BrDinheiroField
from comum.models import Pessoa

###############
### VEICULO ###
###############

class VeiculoTipo(models.Model):
    descricao = models.CharField(max_length=20, unique=True)
    
    class Meta():
        ordering = ['descricao']
        verbose_name = u'Tipo de Veículo'
        verbose_name_plural = u'Tipos de Veículos'
    
    def __unicode__(self):
        return self.descricao

class VeiculoMarca(models.Model):
    nome = models.CharField(max_length=20, unique=True)
    
    class Meta():
        ordering = ['nome']
        verbose_name = u'Marca de Veículo'
        verbose_name_plural = u'Marcas de Veículos'
    
    def __unicode__(self):
        return self.nome


class VeiculoModelo(models.Model):
    nome = models.CharField(max_length=20)
    marca = models.ForeignKey(VeiculoMarca)
    
    class Meta():
        ordering = ['marca', 'nome']
        verbose_name = u'Modelo de Veículo'
        verbose_name_plural = u'Modelos de Veículos'
        unique_together = ('nome','marca')
        
    def __unicode__(self):
        return '%s %s' %(self.marca.nome, self.nome)


class VeiculoCor(models.Model):
    nome = models.CharField(max_length=20, unique=True)
    
    class Meta():
        ordering = ['nome']
        verbose_name = u'Cor do Veículo'
        verbose_name_plural = u'Cores de Veículos'
        
    def __unicode__(self):
        return self.nome


class VeiculoCombustivel(models.Model):
    nome = models.CharField(max_length=20, unique=True)
    
    class Meta():
        ordering = ['-nome']
        verbose_name = u'Combustível do Veículo'
        verbose_name_plural = u'Combustíveis de Veículos'
        
    def __unicode__(self):
        return self.nome


class Veiculo(models.Model):        
    modelo = models.ForeignKey(VeiculoModelo)
    cor = models.ForeignKey(VeiculoCor)
    ano_fabric = models.PositiveSmallIntegerField(u'Ano de Fabricação', null=True, blank=True)
    placa = models.CharField(u'Placa', max_length=9, unique=True)   
    
    lotacao = models.PositiveSmallIntegerField(u'Lotação', null=True, blank=True)
    odometro = models.PositiveIntegerField(u'Odometro', null=True, blank=True)

    combustiveis = models.ManyToManyField(VeiculoCombustivel, null=True, blank=True)
    
    capacidade_tanque = models.PositiveSmallIntegerField(u'Capacidade', null=True, blank=True)
    capacidade_gnv = models.PositiveSmallIntegerField(u'Capacidade (GNV)', null=True, blank=True)
    
    chassi = models.CharField(u'Chassi', max_length=17, unique=True)
    renavam = models.CharField(u'Renavam', max_length=9, unique=True)
    potencia = models.PositiveSmallIntegerField(u'Potência', null=True, blank=True)
    cilindrada = models.PositiveSmallIntegerField(u'Cilindrada', null=True, blank=True)    
    consumo_medio = models.PositiveSmallIntegerField(u'Consumo Médio', null=True, blank=True)
    
    obs = models.TextField(u'Observações', null=True, blank=True)
    
    class Meta():
        ordering = ['modelo', 'placa']
        verbose_name = u'Veículo'
        verbose_name_plural = u'Veículos'
    
    def __unicode__(self):
        return '(%s) %s' %(self.placa.upper(), self.modelo)

###############
### VIATURA ###
###############

class ViaturaStatus(models.Model):
    descricao = models.CharField(max_length=15, unique=True)
    
    class Meta:
        ordering = ['descricao']
        verbose_name=u'Situação da Viatura'
        verbose_name_plural=u'Situações das Viaturas'

    def __unicode__(self):
        return '%s' %(self.descricao)
    
class Viatura(Veiculo):
    tipo = models.ForeignKey(VeiculoTipo)
    status = models.ForeignKey(ViaturaStatus, verbose_name=u'Situação')

    class Meta():
        ordering = ['placa','modelo',]
        verbose_name = u'Viatura'
        verbose_name_plural = u'Viaturas'
    
    def __unicode__(self):
        return '(%s) %s' %(self.placa, self.modelo)
    
    def get_combustiveis(self):
        combustiveis  = ''       
        for i, c in enumerate(self.combustiveis.all()):
            if i == 0:
                combustiveis += '%s' % (c.nome)
            else:
                combustiveis += ' / %s' % (c.nome)
        return combustiveis
    get_combustiveis.allow_tags = True
    get_combustiveis.short_description = 'Combustíveis'
    
class ViagemAgendamento(models.Model):
    status = models.CharField(u'Status', max_length=30, choices=Situacao.get_choices())
    solicitante = models.ForeignKey(Pessoa)
    tipo_viatura = models.ForeignKey(VeiculoTipo)
    objetivo = models.TextField()
    data_saida = models.DateTimeField(verbose_name=u'Data de Saída')
    data_chegada = models.DateTimeField(verbose_name=u'Data de Chegada')
    data_solicitacao = models.DateTimeField(auto_now_add=True, editable=False)
    
    class Meta:
        ordering = ['-status', 'data_saida']
        verbose_name = u'Agendamento de Viagem'
        verbose_name_plural = u'Agendamentos de Viagens'
        
    def __unicode__(self):
        return '#%s' %(self.id)
    
    def save(self):
        if self.id is None:
            self.status = Situacao.PENDENTE        
        super(ViagemAgendamento, self).save()

class ViagemAgendamentoResposta(models.Model):
    agendamento = models.OneToOneField(ViagemAgendamento)
    data = models.DateTimeField(verbose_name=u'Data')
    viatura = models.ForeignKey(Viatura, null=True, blank=True)
    obs = models.TextField(verbose_name=u'Observações', null=True, blank=True)
    
    class Meta:
        verbose_name = u'Resposta do Agendamento de Viagem'
        verbose_name_plural = u'Respostas dos Agendamentos de Viagens'

    def __unicode__(self):
        return '#%s' %(self.id)
    
class Viagem(models.Model):
    agendamento_resposta = models.ForeignKey(ViagemAgendamentoResposta)
    viatura = models.ForeignKey(Viatura) # pode ser diferente da viatura selecionada na resposta do agendamento
    motorista = models.ForeignKey(Pessoa)
    
    saida_odometro = models.PositiveIntegerField()
    saida_data = models.DateTimeField(verbose_name=u'Data de Saída')
    saida_obs = models.TextField(verbose_name=u'Observações', null=True, blank=True)
    
    chegada_odometro = models.PositiveIntegerField(null=True, blank=True)
    chegada_data = models.DateTimeField(verbose_name=u'Data de Chegada', null=True, blank=True)
    chegada_obs = models.TextField(verbose_name=u'Observações', null=True, blank=True)
    
    class Meta:
        ordering = ['saida_odometro']
        verbose_name = u'Viagem'
        verbose_name_plural = u'Viagens'
    
    def __unicode__(self):
        return '#%s' %(self.id)
    
class ViaturaOrdemAbastecimento(models.Model):
    viagem = models.ForeignKey(Viagem)
    data = models.DateTimeField()
    cupom_fiscal = models.CharField(verbose_name=u'Cupom Fiscal', max_length=10, unique=True)
    combustivel = models.ForeignKey(VeiculoCombustivel)
    quantidade = BrDinheiroField()
    valor_unidade = BrDinheiroField()
    oleo = models.CharField(max_length=20, null=True, blank=True)
    valor_oleo = BrDinheiroField(null=True)
    
    class Meta:
        verbose_name=u'Ordem de Abastecimento'
        verbose_name_plural=u'Ordens de Abastecimento'
    
    def __unicode__(self):
        return '#%s' %(self.pk)
    
    def get_valor_total(self):
        if self.valor_oleo is not None:
            return '%.2f' %(self.quantidade * self.valor_unidade + Decimal(self.valor_oleo))
        else:
            return '%.2f' %(self.quantidade * self.valor_unidade)
    get_valor_total.allow_tags = True
    get_valor_total.short_description = 'Valor Total'